package com.qth.valet.common.annotation;

import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

@Slf4j
@Aspect
@Component
public class LogAspect {
    @Pointcut("@annotation(com.qth.valet.common.annotation.Logs)")
    public void pointCut(){}

    @Before(value = "pointCut()")
    public void afterLogWrite(JoinPoint joinPoint){
        // 获取我们调用的方法
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        // 获取方法上的Log注解，因为我们要获取注解中的一些信息
        Logs logs = method.getAnnotation(Logs.class);
        // 获取我们调用的类的名称
        String className = joinPoint.getTarget().getClass().getName();
        // 获取调用的方法的名称
        String methodName = method.getName();
        // 重新修改一下我们调用的方法 是全路径的
        methodName = className + "." + methodName;
        // 获取方法的参数
        Object[] args = joinPoint.getArgs();
        String params = JSONUtil.toJsonStr(args);

        log.info("接口作用："+ logs.operation() + " 接口方法名称："+methodName + " 接口参数:"+ params);
    }
}
